#include <my_header.h>
// 使用mmap拷贝文件 
/* Usage:  */
typedef struct train_s
{
    int len;
    char buf[1000];
}train_t;
// 给客户端回传文件
// 参数：用来和指定客户端通信的socket的文件描述符
int sendFile(int net_fd)
{
    // 第二个版本: 给数据传输加边界 (高级一点: 在应用层自定义了一个协议 )
    train_t file_name;
    bzero(&file_name, sizeof(file_name));

    char *str = "1b.txt";
    memcpy(file_name.buf, str, strlen(str));
    file_name.len = strlen(str);
    send(net_fd, &file_name, sizeof(int) + file_name.len, 0);

    // 需要O_RDWR,避免mmap权限不足
    int file_fd = open(str, O_RDWR);
    
      // 获取文件大小
    struct stat st;
    memset(&st, 0, sizeof(st));
    fstat(file_fd, &st);
    //printf("file_size: %ld \n", st.st_size);
    // 把文件大小发送给客户端
    send(net_fd, &st.st_size, sizeof(off_t), MSG_NOSIGNAL);

    // 使用sendfile:零拷贝
    sendfile(net_fd, file_fd, NULL, st.st_size);


    // 使用mmap获取磁盘数据
   // void *p = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, file_fd, 0);

   // send(net_fd, p, st.st_size, MSG_NOSIGNAL);
   // munmap(p, st.st_size);
   // 
    close(file_fd);
    return 0;

}


